package com.demo.jzoffer2;

import com.demo.domain.TreeNode;
import org.junit.Test;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author gy
 * @date 2023/04
 */
public class Test0411_01 {


    /**
     * 序列化：实体转为字符串
     * 反序列化：字符串转为实体  反其道而行之
     */
    public class Codec {

        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
            // 1、特例处理
            if (root == null) {
                return "[]";
            }
            // 2、初始化
            StringBuilder res = new StringBuilder("[");
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            // 3、层序遍历
            while (!queue.isEmpty()) {
                TreeNode node = queue.poll();
                if (node != null){
                    res.append(node.val).append(",");
                    queue.add(node.left);
                    queue.add(node.right);
                }else {
                    res.append("null,");
                }
            }
            // 4、返回值
            res.deleteCharAt(res.length() -1); // 去除最后一个‘,’
            res.append("]");
            return res.toString();
        }

        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            // 1、特例处理：若 data 为空，直接返回null
            if (data.equals("[]")){
                return null;
            }
            // 2、初始化：序列化列表（先去掉首尾中括号，再用都好隔开），指针 i = 1,根节点 root(vals[0])
            // 队列 queue （包含 root）
            String[] vals = data.substring(1, data.length() - 1).split(",");
            TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
            Queue<TreeNode> queue = new LinkedList<>();
            int i = 1;
            queue.add(root);
            // 3、层序遍历
            while (!queue.isEmpty()) {
                TreeNode node = queue.poll();
                if (!vals[i].equals("null")){
                    node.left = new TreeNode(Integer.parseInt(vals[i]));
                    queue.add(node.left);
                }
                i++;
                if (!vals[i].equals("null")){
                    node.right = new TreeNode(Integer.parseInt(vals[i]));
                    queue.add(node.right);
                }
                i++;
            }
            // 4、返回值
            return root;
        }
    }

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

    @Test
    public void m1() {
//         Codec codec = new Codec();
//         codec.deserialize(codec.serialize(root));
    }

    @Test
    public void m2() {

    }

    @Test
    public void m3() {

    }

}
